代码审计和命令注入
代码
| 1 | 
 | 
三个地方的绕过
| 1 | $num = '1e5'; | 
1e5为100000的科学计数法,将1e5 作为参数放入intval函数内执行会返回结果 1 , 将1e5 加上 1后,其结果为100001,在将100001放入intval,结果自然为100001,成功绕过。
| 1 | $md5=$_GET['md5']; | 
这里的绕过其实有两种方式,我在网上看到的教程大部分都是用 0e215962017 字符串绕过,这串字符经过md5加密后,会得到前两位是 0e 开头的字符串,在经过 == 的比较,就会返回为真。
还有一个方式就是空数组,这个方法在直接在代码里赋值是成立的,但是通过GET传参 md5[]= ,就不能显示,具体原因无从得知,md5对数组加密后会返回Flase ,再与空数组进行比较,会相等。
| 1 | $get_flag = $_GET['get_flag']; | 
不能有空格,cat会被替换成wctf2020,空格代替方式有很多 ${IFS} ${IFS}$9 < 都可用代替空格,cat的代替方式也很多, more tac cat less head tail ,如果是被替换,还可用通过混淆来绕过,比如,cat 被过滤,通过c"at 来绕过。
最终payload
| 1 | fl4g.php?num=1e5&md5=0e215962017&get_flag=c""at<fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag |